﻿namespace LogicStudio.Framework.UI.Conversores
{
    using System.Collections;
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.Primitives;

    public class ConvertirEditor
    {
        #region Métodos Privados

        /// <summary>Setea el enlace a datos</summary>
        /// <param name="control">Control a setearse</param>
        /// <param name="campo">Campo actual de datos</param>
        /// <param name="dependencia">
        /// La propiedad de dependencia a setear el enlace de datos
        /// </param>
        private static void SetearEnlaceDatos(FrameworkElement control, DataField campo, DependencyProperty dependencia)
        {
            var bindingExpression = campo.Content.GetBindingExpression(TextBox.TextProperty);
            if (bindingExpression != null)
            {
                var binding = bindingExpression.ParentBinding;
                control.SetBinding(dependencia, binding);
            }
        }

        #endregion

        #region Métodos Públicos

        /// <summary>
        /// Convierte un campo a un texto multilinea
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        public static void AreaTexto(DataField campo)
        {
            AreaTexto(campo, 40);
        }

        /// <summary>
        /// Convierte un dato DataField a un texto multilinea
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        /// <param name="alto">
        /// Altura del campo deseado
        /// </param>
        public static void AreaTexto(DataField campo, int alto)
        {
            var text = (TextBox)campo.Content;
            text.Height = alto;
            text.TextWrapping = TextWrapping.Wrap;
            text.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto ComboBox
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        public static void Combo(DataField campo)
        {
            var combo = new ComboBox ();
            SetearEnlaceDatos(combo, campo, Selector.SelectedItemProperty);
            campo.Content = combo;
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto ComboBox
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        /// <param name="infoItems">
        /// Lista de item a setearse como origen de datos para el ComboBox
        /// </param>
        public static void Combo(DataField campo, IEnumerable<string> infoItems)
        {
            var combo = new ComboBox { ItemsSource = infoItems };
            SetearEnlaceDatos(combo, campo, Selector.SelectedItemProperty);
            campo.Content = combo;
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto ComboBox
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        /// <param name="infoItems">
        /// Lista de item a setearse como origen de datos para el ComboBox
        /// </param>
        /// <param name="propiedadVisual">
        /// Propiedad a setearse como DisplayMemberPath
        /// </param>
        public static void Combo(DataField campo, IEnumerable infoItems, string propiedadVisual)
        {
            Combo(campo, infoItems, propiedadVisual, propiedadVisual);
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto ComboBox
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        /// <param name="infoItems">
        /// Lista de item a setearse como origen de datos para el ComboBox
        /// </param>
        /// <param name="propiedadVisual">
        /// Propiedad a setearse como DisplayMemberPath
        /// </param>
        /// <param name="propiedadValor">
        /// Propiedad a setearse como SelectedValuePath
        /// </param>
        public static void Combo(DataField campo, IEnumerable infoItems, string propiedadVisual, string propiedadValor)
        {
            var combo = new ComboBox
            {
                ItemsSource = infoItems,
                DisplayMemberPath = propiedadVisual,
                SelectedValuePath = propiedadValor
            };
            SetearEnlaceDatos(combo, campo, Selector.SelectedValueProperty);
            campo.Content = combo;
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto de numerico
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        public static void Numerico(DataField campo)
        {
            Numerico(campo, campo.Content.Width);
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto de numerico
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        /// <param name="ancho">
        /// Ancho del objeto numerico
        /// </param>
        public static void Numerico(DataField campo, double ancho)
        {
            var numeric = new NumericUpDown {Width = ancho, HorizontalAlignment = HorizontalAlignment.Left};
            SetearEnlaceDatos(numeric, campo, NumericUpDown.ValueProperty);
            campo.Content = numeric;
        }

        /// <summary>
        /// Convierte un dato DataField a un objeto de contraseña
        /// </summary>
        /// <param name="campo">
        /// Objeto del tipo DataField a convertirse
        /// </param>
        public static void Contrasenia(DataField campo)
        {
            var password = new PasswordBox();
            SetearEnlaceDatos(password, campo, PasswordBox.PasswordProperty);
            campo.Content = password;
        }


        public static void AutoComplete(DataField campo, IEnumerable<string> infoItems)
        {
            var text = new AutoCompleteBox{ ItemsSource = infoItems};
            SetearEnlaceDatos(text, campo, AutoCompleteBox.TextProperty);
            campo.Content = text;
        }

        #endregion
    }
}